package com.demo.qqClient.service;

import com.demo.qqcommon.Message;
import com.demo.qqcommon.MessageType;
import com.demo.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 该类完成用户登录、用户注册 等功能
 * @author gy
 * @date 2022/5/5
 */
public class UserClientService {

    /**
     * User 属性
     * 我们可能在其他地方使用
     */
    private User user = new User();

    /**
     * 因为 socket 我们在其他地方也要使用，所以把它作为
     * 一个属性进行抽离
     */
    private Socket socket;

    /**
     * 根据用户名 和 密码 验证该用户是否合法
     */
    public boolean checkUser(String userId,String pwd){

        boolean b = false;

        // 创建user对象
        user.setUserId(userId);
        user.setPassword(pwd);
        // 连接到服务端 发送 u 对象

        try {
            // 1、获取 socket连接  和服务器进行通讯
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
            // 获取 ObjectOutputStream流对象，进行数据传送
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            // 发送 u 对象
            oos.writeObject(user);

            // 2、读取从服务端回传的 Message对象
            // 获取 ObjectInputStream流对象，进行数据读取
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            // 开始读取
            Message msg = (Message) ois.readObject();

            // 3、判断 该用户 是否在服务器端验证通过
            if (msg.getMsgType().equals(MessageType.MESSAGE_LOGIN_SUCCESS)) {

                // 一旦成功，就需要启动一个线程  去  维护 socket
                // 创建一个和 服务器端保持通讯的线程    -> 创建一个类 ClientConnectServerThread
                ClientConnectServerThread ccst = new ClientConnectServerThread(socket);
                // 开始启动客户端的线程
                ccst.start();

                // 为了后面客户端的扩展，我们将 socket 放入到 集合中进行管理
                ManageClientConnectServerThread.addClientConnectServerThread(userId,ccst);

                b = true;

            }else {
                // 如果登录失败，我们就不能启动和服务器端通信的线程，关闭socket
                socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        return b;
    }

    /**
     * 向服务器发送请求获取用户在线列表
     */
    public void onlineFriendList(){
        // 发送一个 msg 类型为 MESSAGE_GET_ONLINE_FRIEND
        Message msg = new Message();
        msg.setMsgType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        msg.setSender(user.getUserId());

        //获取 用户对应线程的 对应socket 所关联 的输出流
        try {
            // 拿到 用户id 所对应的线程
            ClientConnectServerThread clientConnectServerThread =
                    ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId());
            // 拿到 线程 所对应的socket 对象
            Socket socket = clientConnectServerThread.getSocket();
            // 拿到 和 socket关联的输出流，再封装成为 对象输出流
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

            // 发送信息
            oos.writeObject(msg);

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 客户端退出系统，并发送 msg 通知 服务器端
     */
    public void logOut(){
        // 封装消息内容
        Message msg = new Message();
        msg.setMsgType(MessageType.MESSAGE_CLIENT_EXIT);
        msg.setSender(user.getUserId());

        // 发送消息内容
        try {
            // 客户端同样有好多线程维护 socket
            ClientConnectServerThread ccst =
                    ManageClientConnectServerThread.getClientConnectServerThread(user.getUserId());
            Socket socket = ccst.getSocket();
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(msg);
            System.out.println(user.getUserId() + " 退出系统 ");
            // 结束进程
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
